Простыми словами, _JWT_ — это лишь строка в следующем формате `header.payload.signature`.

Предположим, что мы хотим зарегистрироваться на сайте. В нашем случае есть три участника — пользователь `user`, сервер приложения `application server` и сервер аутентификации `authentication server`. Сервер аутентификации будет обеспечивать пользователя токеном, с помощью которого он позднее сможет взаимодействовать с приложением.

![[Pasted image 20231104141823.png]]

Приложение использует _JWT_ для проверки аутентификации пользователя следующим образом:


1. Сперва пользователь заходит на сервер аутентификации с помощью аутентификационного ключа (это может быть пара _логин/пароль_, либо _Facebook_ ключ, либо _Google_ ключ, либо ключ от другой учетки).
2. Затем сервер аутентификации создает _JWT_ и отправляет его пользователю.
3. Когда пользователь делает запрос к API приложения, он добавляет к нему полученный ранее _JWT_.
4. Когда пользователь делает API запрос, приложение может проверить по переданному с запросом _JWT_ является ли пользователь тем, за кого себя выдает. В этой схеме сервер приложения сконфигурирован так, что сможет проверить, является ли входящий _JWT_ именно тем, что был создан сервером аутентификации.

В нашем простом примере из 3 участников мы используем _JWT_, который подписан с помощью `HS256` алгоритма и только сервер аутентификации и сервер приложения знают секретный ключ. Сервер приложения получает секретный ключ от сервера аутентификации во время установки аутентификационных процессов. Поскольку приложение знает секретный ключ, когда пользователь делает API-запрос с приложенным к нему токеном, приложение может выполнить тот же алгоритм подписывания к _JWT_, что в шаге _3_. Приложение может потом проверить эту подпись, сравнивая ее со своей собственной, вычисленной хешированием. Если подписи совпадают, значит _JWT_ валидный, т.е. пришел от проверенного источника. Если подписи не совпадают, значит что-то пошло не так — возможно, это является признаком потенциальной атаки. Таким образом, проверяя _JWT_, приложение добавляет доверительный слой _(a layer of trust)_ между собой и пользователем.

---

https://habr.com/ru/articles/340146/
